package cn.wolfcode.wolf2w.service.impl;

import cn.wolfcode.wolf2w.domain.StrategyTheme;
import cn.wolfcode.wolf2w.exception.LogicException;
import cn.wolfcode.wolf2w.query.StrategyThemeQuery;
import cn.wolfcode.wolf2w.repository.StrategyThemeRepository;
import cn.wolfcode.wolf2w.service.IStrategyThemeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 攻略主题业务层的实现类
 */
@Service
public class StrategyThemeServiceImpl implements IStrategyThemeService {

    //  注入StrategyThemeRepository持久层接口
    @Autowired
    private StrategyThemeRepository strategyThemeRepository;

    //  注入MongoTemplate服务
    @Autowired
    private MongoTemplate mongoTemplate;

    //  插入单个方法
    @Override
    public void insert(StrategyTheme strategyTheme) {

        //  id自动生成，手动设置为空
        strategyTheme.setId(null);

        if (strategyTheme.getSequence() != null) {
            //  调用持久层接口的save方法执行插入单个攻略主题对象
            strategyThemeRepository.save(strategyTheme);
        } else {
            throw new LogicException("序号不能为空");
        }

    }

    //  删除单个方法
    @Override
    public void deleteById(String id) {

        //  调用持久层接口的deleteById方法执行删除单个攻略主题对象
        strategyThemeRepository.deleteById(id);
    }

    //  修改单个方法
    @Override
    public void updateById(StrategyTheme strategyTheme) {

        //  调用持久层接口的save方法执行修改单个攻略主题对象
        strategyThemeRepository.save(strategyTheme);
    }

    //  查询单个方法
    @Override
    public StrategyTheme selectById(String id) {
        
        //  调用持久层接口的findById方法执行查询单个攻略主题对象
        return strategyThemeRepository.findById(id).orElse(null);
    }

    //  查询所有方法
    @Override
    public List<StrategyTheme> selectAll() {

        //  调用持久层接口的findAll方法执行查询所有攻略主题对象
        return strategyThemeRepository.findAll();
    }

    //  分页方法
    @Override
    public Page<StrategyTheme> query(StrategyThemeQuery qo) {

        //  查询对象
        Query query = new Query();

        //  调用mongodb服务中的count方法
        //  传入上面的查询对象和StrategyTheme的字节码对象
        //  返回一个满足条件的总记录数
        long totalCount = mongoTemplate.count(query, StrategyTheme.class);

        //  若查询出来的总记录数为零时
        if (totalCount == 0) {

            //  直接返回一个空集合
            return Page.empty();
        }

        //  调用Pageable的of方法
        //  传入qo对象的当前页，qo对象的当前页显示的最大记录数，排序的顺序，通过_id来排序
        Pageable pageRequest = PageRequest.of(qo.getCurrentPage() - 1, qo.getPageSize(), Sort.Direction.ASC, "_id");
        //  把限制条件加入到查询对象中
        query.with(pageRequest);

        //  调用mongodb服务中的find方法
        //  传入上面的查询对象和StrategyTheme的字节码对象
        //  返回一个满足条件的攻略主题对象的集合数据
        List<StrategyTheme> strategyThemes = mongoTemplate.find(query, StrategyTheme.class);
        
        //  返回一个PageImpl的集合
        //  传入一个满足条件的攻略主题对象的集合数据对象
        //  传入限制条件
        //  返回一个满足条件的总记录数
        return new PageImpl<>(strategyThemes, pageRequest, totalCount);
    }


}
